package com.example.controller;

import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.apache.rocketmq.spring.support.RocketMQMessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

/**
 * 发送普通消息
 */
@RestController
@RequestMapping(value = "/normal")
public class ProducerNormalMessageController {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    /**
     * 发送普通消息
     * @param msg
     * @return
     */
    @GetMapping(value = "/send")
    public String sendNormalMessage(String msg){

        //设置消息存放主题名
        String topic="email";
        //设置消息Tag，用于消费端根据指定Tag过滤消息。
        String tag="red";
        //设置消息索引键，可根据关键字精确查找某条消息
        String key= UUID.randomUUID().toString();

        org.apache.rocketmq.common.message.Message message = new org.apache.rocketmq.common.message.Message(topic, tag, key, msg.getBytes(StandardCharsets.UTF_8));

        SendResult sendResult = new SendResult();
        try {
            sendResult = rocketMQTemplate.getProducer().send(message);
        } catch (Exception e) {
            return e.getMessage();
        }

        return  sendResult.toString();
    }


    /**
     * 发送批量普通消息
     * @param msg
     * @return
     */
    @GetMapping(value = "/sendbatch")
    public String sendBatchNormalMessage(String msg){

        for(int i=1;i<=50;i++){
            String s=msg+"_"+i;
            this.rocketMQTemplate.convertAndSend("email:red",s);
        }
        return "ok";

//        //设置消息存放主题名
//        String topic="email";
//        //设置消息Tag，用于消费端根据指定Tag过滤消息。
//        String tag="red";
//        //设置消息索引键，可根据关键字精确查找某条消息
//        String key= UUID.randomUUID().toString();
//
//        org.apache.rocketmq.common.message.Message message = new org.apache.rocketmq.common.message.Message(topic, tag, key, msg.getBytes(StandardCharsets.UTF_8));
//
//        SendResult sendResult = new SendResult();
//        try {
//            sendResult = rocketMQTemplate.getProducer().send(message);
//        } catch (Exception e) {
//            return e.getMessage();
//        }
//
//        return  sendResult.toString();
    }



    /**
     * 发送顺序消息
     * syncSendOrderly：发送同步顺序消息，支持超时设置。
     * asyncSendOrderly：发送异步顺序消息，支持超时设置。
     * sendOneWayOrderly：发送单向超时消息。
     * @param orderId
     * @return
     */
    @GetMapping(value = "/sendOrderly")
    public String sendOrderlyMessage(String orderId){

        //设置消息存放主题名：tag
        String topic="orderly-topic:order";

        rocketMQTemplate.syncSendOrderly(topic, MessageBuilder.withPayload("同步顺序消息,订单编号:"+orderId+" 创建").build(), orderId);
        rocketMQTemplate.syncSendOrderly(topic, MessageBuilder.withPayload("同步顺序消息,订单编号:"+orderId+" 支付").build(), orderId);
        rocketMQTemplate.syncSendOrderly(topic, MessageBuilder.withPayload("同步顺序消息,订单编号:"+orderId+" 确认收货").build(), orderId);

        return "发送顺序消息成功";

    }

    /**
     * 发送延迟消息
     * @param msg
     * @return
     */
    @GetMapping(value = "/sendDelay")
    public String sendDelayMessage(String msg){
        //设置消息存放主题名：tag
        String topic="orderly-topic:order";
        //3秒后再发送消息
        rocketMQTemplate.syncSendDelayTimeMills(topic, MessageBuilder.withPayload("延迟消息:"+msg).build(),30000);

        return "发送延迟消息成功";

    }


}
